# # def wrapper_out(n):
# #     def wrapper(f):
# #         def inner(*args,**kwargs):
# #             ret = f(*args,**kwargs)
# #             return ret
# #         return inner
# #     return wrapper
# #
# #
# # @wrapper_out('随便传')
# # def func():
# #     print('in func')
#
#
#
# # def wrapper1(func1):   # func1 = 原函数f
# #     def inner1():
# #         print('wrapper1 ,before func') # 2
# #         func1()  # f()
# #         print('wrapper1 ,after func')  #　４
# #     return inner1
# #
# # def wrapper2(func2):  # func2 = inner1
# #     def inner2():
# #         print('wrapper2 ,before func')  # 1
# #         func2()  # inner1()
# #         print('wrapper2 ,after func')  # 5
# #     return inner2
# #
# #
# # @wrapper2  # f = wrapper2(f)  执行wrapper2函数 里面的 f == inner1  外面的f == inner2
# # @wrapper1  # f = wrapper1(f)  执行wrapper1函数 里面的 f == 原函数  外面的f == inner1
# # def f():
# #     print('in f') # 3
# #
# # f() # inner2()
#
#
#
# 请实现一个装饰器，限制该函数被调用的频率，如3秒一次（借助于time模块，time.time()）（面试题,有点难度，可先做其他）

# 第一次任意时间调用都可以,从第一次开始计时,10s内不允许调用.
import time

def wrapper(f):
    t = 0
    def inner(*args,**kwargs):
        # if 第二次执行的时间 - 第一次执行的时间 > 3: 逆推法
        #     第一次时间节点: 123443543.546  - 0  肯定 > 3
        #     第二次进入:time.time() 123443545.546  - 123443543.546 < 3
        nonlocal t
        if time.time() - t > 3: # 逆推法
            ret = f(*args,**kwargs)
            t = time.time()
            return ret
    return inner


@wrapper
def func():
    print('in func')

# func()
# time.sleep(4)
# func()

# 请写出下列代码片段的输出结果：
#
# def say_hi(func):
#     def wrapper(*args,**kwargs):
#         print("HI")
#         ret=func(*args,**kwargs)
#         print("BYE")
#         return ret
#     return wrapper
#
# def say_yo(func):
#     def wrapper(*args,**kwargs):
#         print("Yo")
#         return func(*args,**kwargs)
#     return wrapper
# @say_hi
# @say_yo
# def func():
#     print("ROCK&ROLL")
# func()
#
# 编写装饰器完成下列需求:
#
# 用户有两套账号密码,一套为京东账号密码，一套为淘宝账号密码分别保存在两个文件中。
#
# 设置四个函数，分别代表 京东首页，京东超市，淘宝首页，淘宝超市。
#
# 启动程序后,呈现用户的选项为:
#
# ​	1,京东首页
#
# ​	2,京东超市
#
# ​	3,淘宝首页
#
# ​	4,淘宝超市
#
# ​	5,退出程序
#
# 四个函数都加上认证功能，用户可任意选择,用户选择京东超市或者京东首页,只要输入一次京东账号和密码并成功,则这两个函数都可以任意访问;用户选择淘宝超市或者淘宝首页,只要输入一次淘宝账号和密码并成功,则这两个函数都可以任意访问.
#
# 相关提示：用带参数的装饰器。装饰器内部加入判断，验证不同的账户密码。

def wrapper_out(n):
    def wrapper(f):
        def inner(*args,**kwargs):
            username = input('请输入用户名：').strip()
            password = input('请输入密码：').strip()
            with open(n,encoding='utf-8') as f1:
                for line in f1:
                    user,pwd = line.strip().split('|')
                    if username == user and password == pwd:
                        print('登陆成功')
                        ret = f(*args,**kwargs)
                        return ret
                return False
        return inner
    return wrapper


@wrapper_out('JD')
def jd():
    print('欢迎访问京东首页')


@wrapper_out('JD')
def jd_shop():
    print('欢迎访问京东超市')


@wrapper_out('taobao')
def taobao():
    print('欢迎访问淘宝首页')


@wrapper_out('taobao')
def taobao_shop():
    print('欢迎访问淘宝超市')


def _quit():
    pass


choice_dict = {
    1: jd,
    2: jd_shop,
    3: taobao,
    4: taobao_shop,
    5: _quit
}

# while 1:
#     print('''
#     1,京东首页
#
# ​	2,京东超市
#
# ​	3,淘宝首页
#
# ​	4,淘宝超市
#
# ​	5,退出程序''')
#     num = input('请输入:').strip()
#     num = int(num)
#     # if num == 1:
#     #     jd()
#     # elif num == 2:
#     #     jd_shop()
#     #
#     choice_dict[num]()



#
# 用递归函数完成斐波那契数列（面试题）：
#
# 斐波那契数列：1，1，2，3，5，8，13，21..........(第三个数为前两个数的和，但是最开始的1，1是特殊情况，可以单独讨论)
#
# 用户输入序号获取对应的斐波那契数字：比如输入6，返回的结果为8.
#
# 给l1 = [1,1,2,2,3,3,6,6,5,5,2,2] 去重，不能使用set集合（面试题）。

# l1 = [1,1,2,2,3,3,6,6,5,5,2,2]
# # l2 = []
# # #
# # # # 点 转化思路.
# # # for i in l1:
# # #     if i not in l2:
# # #         l2.append(i)
# # # print(l2)